/*
 * Core.h
 *
 *  Created on: 2011/06/04
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_CORE_H
#define INCLUDED_NTENGINE_CORE_H

namespace NTEngine {

/**
 * @brief プラットフォームごとのコアクラス
 * 場合によってはここがUIを管理する場合もある
 */
class Core {
public:
	/**
	 *
	 */
	class Configuration {
	public:
	};
public:
	/**
	 * インスタンス取得
	 */
	Core();

	/**
	 * インスタンス取得
	 * コンストラクタと同じ動作です。
	 */
	static Core instance();

	/**
	 * 現在実行されているスレッドがメインスレッド(描画スレッド)か調べます。
	 */
	static bool isMainThread();

	/**
	 * プログラムに終了要求を出します。
	 */
	void finish();

	/**
	 * アプリケーションに終了要求をだします。
	 * アプリケーションで終了を判定するために使います。
	 */
	void requestEnd();

	/**
	 * 終了要求がきているか判定します。
	 * この関数がtrueを返したらfinish()を呼ぶように実装します。
	 */
	bool isRequestedEnd() const;

	/**
	 * アプリケーションの起動時間を取得します。
	 * 単位はミリ秒です。
	 */
	unsigned time() const;

	/**
	 * ウィンドウがアクティブか問い合わせます
	 */
	bool isActive() const;

#if 1
	/**
	 * ポーズ状態か問い合わせます
	 */
	bool isPause() const;

	/**
	 *
	 */
	bool hasFocus() const;
#endif

	/**
	 * 画面サイズ変更リクエストを設定します。
	 */
	void requestChangeDisplayMode( bool );

	/**
	 * 画面サイズ変更リクエストがきているか
	 */
	bool isRequestedChangeDisplayMode() const;

	/**
	 * ユーザ定義処理
	 * プログラムのスタート時に行う処理を記述します。
	 */
	void start( void* );

	/**
	 * ユーザ定義処理
	 * アプリのコンフィグの設定等を行います。
	 * ユーザ定義関数では一番最初に呼ばれます。
	 */
	void configure( Configuration );

	/**
	 * ユーザ定義処理
	 * メインループの処理を記述します。
	 */
	void update();

	/**
	 * ユーザ定義処理
	 * 終了処理を記述します。
	 */
	void stop();
};

} // namespace NTEngine

#endif // INCLUDED_NTENGINE_ENGINE_H
